<?php
/*
*   app 类应用处理: 路由,函数引入,以及提供公共函数支持
*   2016年9月29日 星期四
*   yanghua
*/
namespace hyang;
use Exception;
require(__DIR__.'/Panel.php');
require(__DIR__.'/Helper.php');

define('Version','2.4');
class App{
    const VERSION = Version;
    public static $Controller; // 控制器
    public static $Action;     // 页面操作
    public static $Source;     // 请求原始参数
    public static $AppRoot;    // 当前APP目录
    public static $Module;     // 模块名
    public static $Pattern;    // 模式
    // 使用straits
    use \hyang\traits\Error;
    // 路由器
    public static function Router($opt=null)
    {
        try{
            if(is_array($opt)) return self::_router($opt);
            self::_init();
            self::_request();
        }catch(Exception $e){
            self::routerError($e);
        }
    }
    // 页面初始化
    private static function _init()
    {        
        if(defined('Chartset')) ini_set('default_charset',Chartset);//默认编码
        if(defined('Auto_Script')){// Common自动加载脚本
            $dir = APP_ROOT.Controller_Path.'Common/';
            foreach(explode(',',Auto_Script) as $v){
                if(is_file($dir.$v.'.php')) require_once($dir.$v.'.php');
            }
        }
    }
    // 请求操作
    private static function _request()
    {
        //生成模式
        if(defined('Pattern') && Pattern != 'PRODUCTION') self::DevelopPattern();
        else self::ProductionPattern();
        if(isset($_GET['s'])){
            self::$Source = $_GET['s'];
            //自定义——SERVER全局值
            $_SERVER['s'] = $_GET['s'];
            $_SERVER['Hyang_Version'] = Version;
            $s = $_GET['s'];unset($_GET['s']);
            $arr = explode('/',ltrim($s,'/'));
            //if(empty($arr[0])) array_shift($arr);
        }else $arr = [];
        // app多模块支持
        $appDir = APP_ROOT.Controller_Path;
        self::$Module = '';
        if(!defined('App_Module')) define('App_Module','C');
        if(App_Module != 'S' && count($arr)>0){
            $tmpDir = $appDir.$arr[0].'/';
            if(is_dir($tmpDir)){
                self::$Module = $arr[0];
                array_shift($arr);
            }elseif(!is_dir($tmpDir) && defined('Default_Module')){
                $tmpDir = $appDir.Default_Module.'/';
            }
            $appDir = is_dir($tmpDir)? $tmpDir:$appDir;
        }
        self::$AppRoot = $appDir;
        // controller
        $ctrl = 'index';
        $pageSuffix = null;
        if(isset($arr[0]) && !empty($arr[0])){
            $pageArr = explode('.',$arr[0]);
            $ctrl = $pageArr[0];
            $pageSuffix = explode(',',Page_Suffix);
            if(isset($pageArr[1]) && !in_array($pageArr[1],$pageSuffix)) self::unfindError($s);
        }
        self::$Controller = $ctrl;
        $ctrl .= defined('Controller_SuffiX')? Controller_SuffiX:'';
        $file = $appDir.$ctrl.'.php';
        if(!is_file($file)) self::unfindError($s);
        require_once($file);
        //eval('$app = new '.$ctrl.'();');// PHP变量可做为类名
        $app = new $ctrl();

        // action
        $action = 'index';
        if(isset($arr['1']) && !empty($arr['1'])){
            $pageArr = explode('.',$arr['1']);
            $action = $pageArr[0];
            if(!is_array($pageSuffix)) $pageSuffix = explode(',',Page_Suffix);
            if(isset($pageArr[1]) && !in_array($pageArr[1],$pageSuffix)) self::unfindError($s);
        }
        self::$Action = $action;
        $action .= defined('Action_SuffiX')? Action_SuffiX:'';
        //if(method_exists($app,$action)) eval('$app->'.$action.'();');
        if(method_exists($app,$action)) $app->$action();
        else self::unfindError($s);
    }
    // 路由请求器
    private static function _router($opt)
    {
    }
    // 同一目录自动引入
    public static function AutoInclude($name){
        $arr = is_array($name)? $name:[$name];
        $dir = __DIR__.'/';
        foreach($arr as $v){
            $file = $dir.$v.'.php';
            if(is_file($file)) require_once($file);
        }
    }
    // 生成模式
    public static function DevelopPattern()
    {
        error_reporting(E_ALL);
        self::$Pattern = 'D';
    }
    // 部署模式
    public static function ProductionPattern()
    {
        error_reporting(0);
        self::$Pattern = 'P';
    }
}
?>